#!/usr/bin/env python
# coding: utf-8

# ## 课堂学习内容：
# > * 1、 高德API-WEB服务
# > * 2、API经济成本的预估（调用量、并大量）
# > * 3、地理编码
# ...
# 
# ## 课后练习：
# > * 1、[地理编码](https://lbs.amap.com/api/webservice/guide/api/georegeo/)
# > * 2、[路径规划](https://lbs.amap.com/api/webservice/guide/api/direction)
# > * 3、[行政区域查询](https://lbs.amap.com/api/webservice/guide/api/district)
# > * 4、[搜索POI](https://lbs.amap.com/api/webservice/guide/api/search)
# > * 5、[IP定位](https://lbs.amap.com/api/webservice/guide/api/ipconfig)

# ## 小知识
# * 键盘a ：向上增加一栏
# * 键盘b ：向下增加一栏
# * 键盘dd ：删除一栏

# ## **[错误码说明文档](https://lbs.amap.com/api/webservice/guide/tools/info)**

# ## 高德API

# ### 地理编码/逆地理编码

# #### 准备工作

# In[6]:


import requests,json
import pandas as pd
wu_key = "1ec9df4a24601ac918e0b7ab0440f593"


# #### 地理编码
# > * 1、结构化地址的定义： 首先，地址肯定是一串字符，内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意：针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略，但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息。
# > * 2、url：https://restapi.amap.com/v3/geocode/geo?parameters
# > * 3、requests.get()
# > * 4、参数：
#  必选：key（高德Key）、address（结构化地址信息）

# In[7]:


# 数据准备
中大南方_address = "广东省广州市中山大学南方学院"


# In[8]:


# 地理编码的函数
def geo(key,address,city=None,batch="false",sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
       "key":key,
       "address":address,
       "city":city,
       "batch":batch,
       "sig":sig,
       "output":output,
       "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results    


# In[9]:


geo(wu_key,中大南方_address)


# In[10]:


中大南方_LOCATION = geo(wu_key,中大南方_address)['geocodes'][0]['location']
中大南方_LOCATION 


# #### 逆地理编码：
# > * 1、url:https://restapi.amap.com/v3/geocode/regeo?parameters
# > * 2、requests.get()
# > * 3、参数：
# 必选：key（高德Key）、location（经纬度坐标）
# 可选：extensions[（默认：base）可选"all"，描述数据详细指数]

# In[11]:


# 逆地理编码的函数
def regeo(key,location,extensions="all",radius=None,poitype=None,batch="false",roadlevel=None,sig=None,output="json",callback=None,homeorcorp=0):
    url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
    params = {
        "key":key,
        "location":location,
        "extensions":extensions,
        "radius":radius,
        "poitype":poitype,
        "batch":batch,
        "roadlevel":roadlevel,
        "sig":sig,
        "output":output,
        "callback":callback,
        "homeorcorp":homeorcorp
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[12]:


regeo(wu_key,中大南方_LOCATION)


# In[13]:


# 列表切片，把r.json()中的路名找出来，并且创建一个新的列表
_roads_ =[]
for item in regeo(wu_key,中大南方_LOCATION)['regeocode']['roads']:
# print(item['name'])
    _roads_.append(item['name'])
_roads_


# In[14]:


# 把数据规划化，制作成一个表格的样子
pd.json_normalize(regeo(wu_key,中大南方_LOCATION)['regeocode']['roads'])


# In[15]:


pd.json_normalize(regeo(wu_key,中大南方_LOCATION)['regeocode']['pois'])


# In[16]:


pd.json_normalize(regeo(wu_key,中大南方_LOCATION)['regeocode']['pois'])['name'].to_list()


# ### 路径规划

# #### 路径规划：
# > * 1、路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口，返回JSON 或 XML格式的查询数据，用于实现路径规划功能的开发。 由于道路/数据/算法的变更，很可能存在间隔一段时间后请求相同起终点的经纬度返回不同结果。
# #### 步行路径规划 API 可以规划100KM以内的步行通勤方案，并且返回通勤方案的数据
# > * 2、url：https://restapi.amap.com/v3/direction/walking?parameters
# > * 3、requests.get()
# > * 4、参数：
# 必选：key（高德API key）、origin（出发点）、destination（目的地）

# In[75]:


# 数据准备： 
origin = "广东省广州市中山大学南方学院"
destination = "广州市从化区温泉派出所"


# In[76]:


def geocode(key,address,city=None,batch=None)->str:
    """获取高德API的地理编码
    注释：key是指高德API的秘钥，请先去注册
          address是指结构化地址，具体请查看：https://lbs.amap.com/api/webservice/guide/api/georegeo   
    """
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
        "key":key,
        "address":address,
        "city":city,
        "batch":batch
    }
    response = requests.get(url,params=params)
    results = response.json()['geocodes'][0]['location']
    # 返回值
    return results
    


# In[77]:


help(geocode)


# In[78]:


#geocode(高德API_key,结构化地址)


# In[79]:


起始点_中大南方 = geocode(wu_key,origin)
起始点_中大南方


# In[80]:


目的地_派出所 = geocode(wu_key,destination)
目的地_派出所


# In[81]:


# 步行规划的函数
def walking(key,origin,destination,sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/direction/walking?parameters"
    params ={
        "key":key,
        "origin":origin,
        "destination":destination,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results
    


# In[98]:


walking(wu_key,起始点_中大南方,目的地_派出所)


# #### 公交路径规划 API 可以规划综合各类公共（火车、公交、地铁）交通方式的通勤方案，并且返回通勤方案的数据
# > * 1、url:https://restapi.amap.com/v3/direction/transit/integrated?parameters
# > * 2、requests.get()
# > * 3、参数：
# 1. 必选：key、origin、destination、city（城市/跨城规划时的起点城市）
# 2. 可选：cityd（跨城公交规划时的终点城市）（跨城必选）

# In[99]:


# 数据准备： 
origin1 = "暨南大学"
destination1 = "广州塔"


# In[100]:


起始点_暨南大学 = geocode(wu_key,origin1)
起始点_暨南大学


# In[101]:


目的地_广州塔 = geocode(wu_key,destination1)
目的地_广州塔


# In[102]:


# 公交路径规划的函数
def integrated(key,origin,destination,city=None,cityd=None,extensions="base",strategy=0,nightflag=0,date=None,time=None,sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/direction/transit/integrated?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "city":city,
        "cityd":cityd,
        "extensions":extensions,
        "strategy":strategy,
        "nightflag":nightflag,
        "date":date,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results    


# In[103]:


integrated(wu_key,起始点_暨南大学,目的地_广州塔,"guangzhou")


# #### 驾车路径规划 API 可以规划以小客车、轿车通勤出行的方案，并且返回通勤方案的数据
# > * 1、url：https://restapi.amap.com/v3/direction/driving?parameters
# > * 2、requests.get()
# > * 3、参数：
#     1. 必选：key、origin、destination、city、cityd
#     2. 可选：extensions

# In[104]:


# 数据准备： 
origin2 = "广东省广州市中山大学南方学院"
destination2 = "广东省揭阳市政府"


# In[91]:


起始点_中大南方 = geocode(wu_key,origin2)
起始点_中大南方


# In[92]:


目的地_揭阳 = geocode(wu_key,destination2)
目的地_揭阳


# In[95]:


# 驾车路径规划的函数
def driving(key,origin,destination,originid=None,destinationid=None,origintype=None,destinationtype=None,strategy=0,waypoints=None,avoidpolygons=None,avoidroad=None,province=None,number=None,cartype=0,ferry=0,roadaggregation="false",nosteps=0,sig=None,output="json",callback=None,extensions="all"):
    url = "https://restapi.amap.com/v3/direction/driving?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "originid":originid,
        "destinationid":destinationid,
        "origintype":origintype,
        "destinationtype":destinationtype,
        "strategy":strategy,
        "waypoints":waypoints,
        "avoidpolygons":avoidpolygons,
        "avoidroad":avoidroad,
        "province":province,
        "number":number,
        "cartype":cartype,
        "ferry":ferry,
        "roadaggregation":roadaggregation,
        "nosteps":nosteps,
        "sig":sig,
        "output":output,
        "callback":callback,
        "extensions":extensions
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[96]:


driving(wu_key,起始点_中大南方,目的地_揭阳,"guangzhou","yunfu")


# #### 骑行路径规划用于规划骑行通勤方案，规划时不会考虑路况；考虑天桥、单行线、封路等情况
# > * 1、url：https://restapi.amap.com/v4/direction/bicycling?parameters
# > * 2、requests.get()
# > * 3、参数：必选：key、origin、destination

# In[35]:


# 数据准备
origin3 = "广东省广州市中山大学南方学院"
destination3 = "广东省从化客运站"


# In[36]:


起始点_中大南方 = geocode(wu_key,origin3)
起始点_中大南方


# In[37]:


目的地_从化客运站 = geocode(wu_key,destination3)
目的地_从化客运站


# In[38]:


# 骑车路径规划的函数
def bicycling(key,origin,destination,output="json"):
    url = "https://restapi.amap.com/v4/direction/bicycling?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[39]:


bicycling(wu_key,起始点_中大南方,目的地_从化客运站)


# #### 货车路径
# > * 1、url:https://restapi.amap.com/v4/direction/truck?parameters
# > * 2、requests.get()
# > * 3、参数
# 必选：key、origin、destination、size（车辆大小）

# In[105]:


# 数据准备
origin4 = "广东省广州市中山大学南方学院"
destination4 = "广东省中山市政府"


# In[106]:


起始点_中大南方 = geocode(wu_key,origin4)
起始点_中大南方


# In[107]:


目的地_中山 = geocode(wu_key,destination4)
目的地_中山


# In[108]:


# 货车路径规划的函数
def truck(key,origin,destination,size,originid=None,originidtype=None,destinationid=None,destinationtype=None,diu=None,strategy=1,waypoints=None,height=1.6,width=2.5,load=10,weight=0.9,axis=2,province=None,number=None,cartype=0,avoidpolygons=None,showpolyline=1,nosteps=0,output="json"):
    url = "https://restapi.amap.com/v4/direction/truck?parameters"
    params = {
        "key":key,
        "origin":origin,
        "originidtype":originidtype,
        "destination":destination,
        "destinationid":destinationid,
        "destinationtype":destinationtype,
        "diu":diu,
        "strategy":strategy,
        "waypoints":waypoints,
        "size":size,
        "height":height,
        "width":width,
        "load":load,
        "weight":weight,
        "axis":axis,
        "province":province,
        "number":number,
        "cartype":cartype,
        "avoidpolygons":avoidpolygons,
        "showpolyline":showpolyline,
        "nosteps":nosteps,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[109]:


truck(wu_key,起始点_中大南方,目的地_中山,2)


# #### 距离测量
# > * 1、url：https://restapi.amap.com/v3/distance?parameters
# > * 2、requests.get()
# > * 3、参数
#     1. 必选：key、origins、destination
#     2. type（路径计算的方式和方法）默认：1

# In[110]:


# 数据准备
# 数据准备
origin4 = "广东省广州市中山大学南方学院"
destination4 = "广东省深圳市政府"


# In[111]:


起始点_中大南方 = geocode(wu_key,origin4)
起始点_中大南方


# In[112]:


目的地_深圳市政府 = geocode(wu_key,destination4)
目的地_深圳市政府


# In[48]:


# 距离测量的函数
def distance(key,origins,destination,type=1,sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/distance?parameters"
    params = {
        "key":key,
        "origins":origins,
        "destination":destination,
        "type":type,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[113]:


distance(wu_key,起始点_中大南方,目的地_深圳市政府)


# ### 行政区域查询

# #### 行政区域查询是一类简单的HTTP接口，根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。
# > * 1、url：https://restapi.amap.com/v3/config/district?parameters
# > * 2、requests.get()
# > * 3、参数：
#      1. 必选：key
#      2. keyword（查询关键字）

# In[50]:


# 行政区域查询的函数
def district(key,keywords=None,subdistrict=1,page=1,offset=20,extensions="base",filter=None,callback=None,output="json"):
    url = "https://restapi.amap.com/v3/config/district?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "subdistrict":subdistrict,
        "page":page,
        "offset":offset,
        "extensions":extensions,
        "filter":filter,
        "callback":callback,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[51]:


district(wu_key,"广东")


# ### 搜索POI

# #### 搜索服务API是一类简单的HTTP接口，提供多种查询POI信息的能力，其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。
# > * 1、url：https://restapi.amap.com/v3/place/text?parameters
# > * 2、requests.get()
# > * 3、参数
#  必选：key、keywords、types（keywords和types必须至少有一个）

# In[52]:


# 关键字搜索的函数
def text(key,keywords=None,types=None,city=None,citylimit="false",children=0,offset=20,page=1,extensions="base",sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/place/text?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "types":types,
        "city":city,
        "citylimit":citylimit,
        "children":children,
        "offset":offset,
        "page":page,
        "extensions":extensions,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[53]:


text(wu_key)


# #### 周边搜索
# > * 1、url：https://restapi.amap.com/v3/place/around?parameters
# > * 2、requests.get()
# > * 3、参数
# 必选：key、location（中心点坐标）

# In[54]:


# 数据准备
origin5 = "广东省广州市中山大学南方学院"


# In[55]:


起始点_中大南方 = geocode(wu_key,origin5)
起始点_中大南方


# In[56]:


# 周边搜索的函数
def around(key,location,keywords=None,types=None,city=None,radius=3000,sortrule="distance",offset=20,page=1,extensions="base",sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/place/around?parameters"
    params = {
        "key":key,
        "location":location,
        "keywords":keywords,
        "types":types,
        "city":city,
        "radius":radius,
        "sortrule":sortrule,
        "offset":offset,
        "page":page,
        "extensions":extensions,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[57]:


around(wu_key,起始点_中大南方)


# #### 多边形搜索
# > * 1、url：https://restapi.amap.com/v3/place/polygon?parameters
# > * 2、requests.get()
# > * 3、参数
# 必选：key、polygon（经纬度坐标对）
# 可选：types（查询POI类型）当keywords和types为空的时候， 我们会默认指定types为120000（商务住宅）&150000（交通设施服务） 、offset（每页记录数据）【强烈建议不超过25，若超过25可能造成访问报错。一般选20】、page（当前页数）【最大翻页数100。一般选1】、extensions（返回结果控制）【此项默认base 返回基本地址信息；取值为all返回地址信息、附近POI、道路以及道路交叉口信息。】

# In[58]:


# 多边形搜索的函数
def polygon(key,polygon,keywords=None,types=None,offset=20,page=1,extensions="base",sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/place/polygon?parameters"
    params = {
        "key":key,
        "polygon":polygon,
        "keywords":keywords,
        "types":types,
        "offset":offset,
        "page":page,
        "extensions":extensions,
        "sig":sig,
        "output":output,
        "callback":callback        
    }
    r =requests.get(url,params)
    results = r.json()
    return results


# In[59]:


polygon(wu_key,"116.460988,40.006919|116.48231,40.007381;116.47516,39.99713|116.472596,39.985227|116.45669,39.984989|116.460988,40.006919")


# #### ID查询
# > * 1、url：https://restapi.amap.com/v3/place/detail?parameters
# > * 2、requests.get()
# > * 3、参数
# 必选：key、id（兴趣点ID）

# In[60]:


# ID查询的函数
def detail(key,id,sig=None,output="json",callback=None):
    url = "https://restapi.amap.com/v3/place/detail?parameters"
    params = {
        "key":key,
        "id":id,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[61]:


detail(wu_key,"B0FFFAB6J2")


# ### IP定位

# #### IP定位：IP定位是一个简单的HTTP接口，根据用户输入的IP地址，能够快速的帮用户定位IP的所在位置。
# > * 1、url：https://restapi.amap.com/v3/ip?parameters
# > * 2、requests.get()
# > * 3、参数
# 必选：key
# 可选：IP（ip地址）【需要搜索的IP地址（仅支持国内）若用户不填写IP，则取客户http之中的请求来进行定位】

# In[114]:


# IP定位的函数
def ip(key,ip,sig=None,output="json"):
    url = "https://restapi.amap.com/v3/ip?parameters"
    params = {
        "key":key,
        "ip":ip,
        "sig":sig,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[115]:


ip(wu_key,"81.71.84.13")


# ### 静态地图

# #### 静态地图：静态地图服务通过返回一张地图图片响应HTTP请求，使用户能够将高德地图以图片形式嵌入自己的网页中。用户可以指定请求的地图位置、图片大小、以及在地图上添加覆盖物，如标签、标注、折线、多边形。
# > * 1.url：https://restapi.amap.com/v3/staticmap?parameters
# > * 2.requests.get
# > * 3.参数：必选：key,location,zoom(地图级别) 可选：size（地图大小）默认为400*400；scale（普通/高清）普通为1，高清为2 默认值为1,；traffic（交通路况标识）默认为0

# In[64]:


from PIL import Image
from io import BytesIO


# In[65]:


暨南大学 = geocode(wu_key,origin1)
暨南大学


# In[66]:


# 静态地图的函数
def staticmap(key,location,zoom):
    url = "https://restapi.amap.com/v3/staticmap?parameters"
    params = {
        "key":key,
        "location":location,
        "zoom":zoom
    }
    r = requests.get(url,params=params)
    results = Image.open(BytesIO(r.content))
    return results


# In[67]:


staticmap(wu_key,暨南大学,15)


# ### 坐标转换

# #### 坐标转换：坐标转换是一类简单的HTTP接口，能够将用户输入的非高德坐标（GPS坐标、mapbar坐标、baidu坐标）转换成高德坐标。
# > * 1.url：https://restapi.amap.com/v3/assistant/coordinate/convert?parameters
# > * 2.requests.get
# > * 3.参数：必选：key，locations  可选：coordsys（原坐标系）默认为autonavi；output默认值为json

# In[68]:


import requests,json


# In[69]:


# 坐标转换的函数
def convert(key,locations,coordsys="autonavi",output="json"):
    url = "https://restapi.amap.com/v3/assistant/coordinate/convert?parameters"
    params = {
        "key":key,
        "locations":locations,
        "coordsys":coordsys,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results
            


# In[70]:


convert(wu_key,"116.481499,39.990475|116.481499,39.990375")


# ### 天气查询

# #### 天气查询：天气查询是一个简单的HTTP接口，根据用户输入的adcode，查询目标区域当前/未来的天气情况。
# > * 1.url：https://restapi.amap.com/v3/weather/weatherInfo?parameters
# > * 2.requests.get
# > * 3.参数 必选：key，city(城市编码)  可选：extensions

# In[116]:


# 天气查询
def weatherinfo(key,city,extensions="all",output="json"):
    url = "https://restapi.amap.com/v3/weather/weatherInfo?parameters"
    params = {
        "key":key,
        "city":city,
        "extensions":extensions,
        "output":output
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[117]:


weatherinfo(wu_key,445200)


# ### 输入提示

# #### 输入提示：输入提示是一类简单的HTTP接口，提供根据用户输入的关键词查询返回建议列表。
# > * 1.url：https://restapi.amap.com/v3/assistant/inputtips?parameters
# > * 2.requests.get
# > * 3.参数 必选：key，keywords 可选：type（POI分类），location，city，citylimit（仅返回指定城市数据）默认值为false，datatype（默认值all），sig，output，callback

# In[119]:


# 输入提示的函数
def inputtips(key,keywords,type=None,location=None,city=None,citylimit=None,datatype="all",sig=None,output=None,callback=None):
    url = "https://restapi.amap.com/v3/assistant/inputtips?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "type":type,
        "location":location,
        "city":city,
        "citylimit":citylimit,
        "datatype":datatype,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[120]:


inputtips(wu_key,"肯德基")

